﻿/*
*************************************************************************

 Le logiciel de gestion d'EPN

 @project OpenEPN.
 @version 0.9
 @legals  (c) 2008 Damien Maillard, Sébastien Reinders. 
 Needed Components : GTK-Sharp 2.8. 
 Licensed under GPL v2.

 @author  Damien Maillard <damien.maillard@openepn.be>
 @author  Sébastien Reinders <sebastien.reinders@openepn.be>
 @author  Didier Piette <didier.piette@openepn.be>
 @author  Nicolas Karras <nicolas.karras@openepn.be>
 @author  Julien Poulin <julien.poulin@openepn.be>
 @author  Alain Rollmann <alain.rollmann@openepn.be>
 @since   2008.02.08
 @latest  2011.04.04

 This program is free software; you can 
 redistribute it and/or modify it under
 the terms of the GNU General Public License as 
 published by the Free Software
 Foundation; either version 2 of the License, or 
 (at your option) any later version.

 This program is distributed in the hope that it 
 will be useful, but WITHOUT ANY WARRANTY; without even 
 the implied warranty of MERCHANTABILITY or FITNESS
 FOR A PARTICULAR PURPOSE. See the GNU General 
 Public License for more details.

 You should have received a copy of the GNU General 
 Public License along with this program; if not, 
 write to the Free Software Foundation, Inc., 59 Temple
 Place, Suite 330, Boston, MA 02111-1307 USA.
 
 * 
 * Conventions de nommage pour les variables locales :
 * m_ : pour les variables membres d'une méthode;
 * g_ : pour les variables membres d'une classe ;
 * c_ : pour les constantes;
 * s_ : pour les variables statiques;
 * e_ : pour les énumérations;
 * a_ : pour les Array et ArrayList;
 *  _ : pour les paramètres passés aux méthodes
 * T_ : T majuscule pour les Threads
 * E_ : E majuscule pour les événements
 * 
 
*************************************************************************
*/

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using log4net;
using log4net.Config;
using System.IO;
using System.Reflection;

namespace OpenEPN
{
    /// <summary>
    /// Classe de base de l'application
    /// </summary>
    static class Program
    {
        #region "Déclarations"

        private static ILog g_Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        #endregion

        #region "Propriétés"

        //Pas de propriétés

        #endregion

        #region "Constructeur"

        //Pas de constructeur puisque point d'entrée de l'application

        #endregion

        #region "Implémentations"

        #region "Méthodes privées"

        /// <summary>
        /// Point d'entrée principal de l'application.
        /// </summary>
        [STAThreadAttribute]
        static void Main()
        {
            //XmlConfigurator.ConfigureAndWatch(new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "\\xml\\log4net.config")));
            FileInfo log4NetConfig = new FileInfo(Application.StartupPath + @"\log4net.config");
            Console.WriteLine(log4NetConfig.Exists);

            XmlConfigurator.ConfigureAndWatch(log4NetConfig);
            log4net.GlobalContext.Properties["version"] = Assembly.GetEntryAssembly().GetName().Version.ToString();

            // TODO: Supprimer après...
            //Console.WriteLine(LogManager.GetRepository().GetAppenders().Length); 
            //m_Logger.Debug("Test log4net");

            Application.ThreadException += Application_ThreadException;
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new fen_Main());
        }

        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            Exception exception = e.ExceptionObject as Exception;
            if (exception != null)
            {
                LogException("Domain Exception", exception);
            }
        }

        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            LogException("Thread Exception", e.Exception);
        }

        static void LogException(string exceptionSource, Exception exception)
        {
            g_Logger.Fatal(exceptionSource, exception);
        }

        #endregion

        #region "Méthodes publiques"

        //Pas de méthodes publiques

        #endregion

        #endregion

    }

}